load("@rules_proto//proto:defs.bzl", "proto_library")
load("@rules_python//python:defs.bzl", "py_binary")
load("@nanopb_pypi//:requirements.bzl", "requirement")
load("@rules_proto_grpc//:defs.bzl", "proto_plugin")
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
load("//extra/bazel:nanopb_cc_proto_library.bzl", "cc_nanopb_proto_library")
load("@rules_python//python/pip_install:requirements.bzl", "compile_pip_requirements")

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

exports_files(["LICENSE.txt"])

cc_library(
    name = "nanopb",
    srcs = [
        "pb_common.c",
        "pb_decode.c",
        "pb_encode.c",
    ],
    hdrs = [
        "pb.h",
        "pb_common.h",
        "pb_decode.h",
        "pb_encode.h",
    ],
    visibility = ["//visibility:public"],
)

copy_file(
    name = "protoc-gen-nanopb.py",
    src = "generator/protoc-gen-nanopb",
    out = "generator/protoc-gen-nanopb.py",
    allow_symlink = True,
)

py_binary(
    name = "protoc-gen-nanopb",
    srcs = [
        "generator/nanopb_generator.py",
        ":protoc-gen-nanopb.py",
    ],
    deps = [
        requirement("grpcio-tools"),
    ],
)

proto_plugin(
    name = "nanopb_plugin",
    options = [
        '--library-include-format=quote',
    ],
    outputs = [
        "{protopath}.pb.h",
        "{protopath}.pb.c",
    ],
    separate_options_flag = True,
    tool = ":protoc-gen-nanopb",
    visibility = ["//visibility:public"],
)

proto_library(
    name = "descriptor",
    srcs = [
        "generator/proto/google/protobuf/descriptor.proto",
    ],
    strip_import_prefix = "generator/proto/",
)

proto_library(
    name = "nanopb_proto",
    srcs = [
        "generator/proto/nanopb.proto",
    ],
    strip_import_prefix = "generator/proto/",
    deps = [":descriptor"],
)

cc_nanopb_proto_library(
    name = "test_compilation",
    protos = [":descriptor"],
    visibility = ["//visibility:private"],
)

# Run `bazel run //:requirements.update` if you want to update the requirements.
compile_pip_requirements(
    name = "requirements",
    extra_args = ["--allow-unsafe"],
    requirements_in = "extra/requirements.txt",
    requirements_txt = "extra/requirements_lock.txt",
)
